package com.swak.consistency.tcc.role.impls;

import com.swak.consistency.tcc.context.TccContext;
import com.swak.consistency.tcc.context.TransParticipant;
import com.swak.consistency.tcc.role.AbstractTransRoler;

/**
 * 事务发起者
 * 
 * @author DELL
 */
public class TransInitiator extends AbstractTransRoler {

	@Override
	public Object doHandle(TccContext context) {
		
		// 开启全局事务
		this.openGlobalTrans(context);

		// 开启分支事务
		TransParticipant branch = this.openBranchTrans(context);

		// 执行业务代码(如果 doPrepare 执行成功，但是 postBranchTrans 执行失败 会导致不能执行取消)
		// 所有 postBranchTrans 必须要能影响 doPrepare 的事务
		Object result = this.doPrepare(context);

		// 确定分支事务
		this.postBranchTrans(context, branch);

		// 确定事务执行成功
		this.postGlobalTrans(context);

		// 返回数据
		return result;
	}

}